#ifndef __TP3_H__
#define __TP3_H__

#include "ImageGray.h"
#include "fft2d_util.h"
#include "ipFFT2D.h"
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <tr1/array>
#include <tr1/memory>

using namespace Torch;

class fft2dTf {
public:
	char* file_name;

	std::tr1::shared_ptr<Torch::ImageGray> initial_image;
	std::tr1::shared_ptr<Torch::ImageGray> power_2_image;
	
	std::tr1::shared_ptr<Torch::ipFFT2D> fft2d;
	std::tr1::shared_ptr<Torch::ipFFT2D> ifft2d;

	float* fft_real;
	float* fft_imaginary;
	float* spectrum;


	fft2dTf(char *file_name);

	~fft2dTf();
	
	//cette fonction calcule la transformee de fourier
	void fft();	
	//cette fonction calcule l'inverse de la transformee de fourier
	//option permet de preciser que l'on veut obtenir l'inverse de la transformee de foureir (valeur 0) 
	//ou l'inverse de l'image dans laquelle on a reduit du bruit (toute valeur differente de 0) 
	// 
	void reverseFft(char *name);
	
	//cette fonction applique le filtre filtre1 du fichier fft2d_util
	void applayfiltre1(float factor);
	
	//cette fonction applique le filtre filtre2 du fichier fft2d_util
	void applayfiltre2(float factor, bool inverse);
	
	//cette fonction  supprime du bruit dans l'image produite par le filtre 1
	void removeNoise(float factor);

	/*Cette fonction transforme un tableau 1D en une image 2D
	* choice permet de choisir entre la partie imaginaire, la partie reele et le spectre de fourrier
	* 0 correspond a la partie relle 
	* 1 correspond a la partie imaginaire
	* 2 correspond au spectre de fourier
	*/
	void fromTab1D_to_Immage2d(bool improve, bool swap,int choice);	

	char* newName(char*oldname,char*nouveau);

	void compute_spectre();

	/*
	*renvoie la longueur de lachaine prise en entree 
	*
	*/
	int longueur(char* chaine);
	
	real *DefinirFiltre3 (int width, int height, float facteur, bool inverse,int xcord,int ycord);

	void AppliquerFiltre3 (real *fft, real *filtre2, int size);

};

#endif /* IMAGEFFT_H_ */
